package com.ruoyi.ssh.service.impl;

import java.util.List;

import com.ruoyi.ssh.domain.Chapter;
import com.ruoyi.ssh.domain.Subject;
import com.ruoyi.ssh.mapper.ChapterMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.ssh.mapper.CourseMapper;
import com.ruoyi.ssh.domain.Course;
import com.ruoyi.ssh.service.ICourseService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 课程管理Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-08-13
 */
@Service
public class CourseServiceImpl implements ICourseService 
{
    @Autowired
    private CourseMapper courseMapper;
    @Autowired
    private ChapterMapper chapterMapper;

    /**
     * 查询课程管理
     * 
     * @param id 课程管理主键
     * @return 课程管理
     */
    @Override
    public Course selectCourseById(Integer id)
    {
        return courseMapper.selectCourseById(id);
    }

    /**
     * 查询课程管理列表
     * 
     * @param course 课程管理
     * @return 课程管理
     */
    @Override
    public List<Course> selectCourseList(Course course)
    {
        return courseMapper.selectCourseList(course);
    }

    /**
     * 新增课程管理
     * 
     * @param course 课程管理
     * @return 结果
     */
    @Override
    public int insertCourse(Course course)
    {
        return courseMapper.insertCourse(course);
    }

    /**
     * 修改课程管理
     * 
     * @param course 课程管理
     * @return 结果
     */
    @Override
    public int updateCourse(Course course)
    {
        return courseMapper.updateCourse(course);
    }

    /**
     * 批量删除课程管理
     * 
     * @param ids 需要删除的课程管理主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteCourseByIds(Integer[] ids)
    {
        // 检查每个课程下是否存在未删除的章节
        for (int i = 0; i < ids.length; i++) {
            Integer id = ids[i];
            Chapter chapter = new Chapter();
            chapter.setCourseId(id);
            List<Chapter> chapters = chapterMapper.selectChapterList(chapter);
            // 检查是否存在未删除的章节(del=1表示未删除)
            boolean hasUndeletedChapter = false;
            for (Chapter chapter1 : chapters) {
                if (chapter1.getDel() == 1) {
                    hasUndeletedChapter = true;
                    break;
                }
            }
            if (hasUndeletedChapter) {
                Course course1 = courseMapper.selectCourseById(id);
                throw new RuntimeException("课程\"" + course1.getName() + "\"下存在章节，无法删除");
            }
        }
        return courseMapper.deleteCourseByIds(ids);
    }

    /**
     * 删除课程管理信息
     * 
     * @param id 课程管理主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteCourseById(Integer id)
    {
        //判断是否有未删除的章节
        Chapter chapter = new Chapter();
        chapter.setCourseId(id);
        List<Chapter> chapterList = chapterMapper.selectChapterListWithCourse(chapter);
        // 检查是否存在未删除的章节(del=1表示未删除)
        boolean hasUndeletedChapter = false;
        for (Chapter chapter1 : chapterList) {
            if (chapter1.getDel() == 1) {
                hasUndeletedChapter = true;
                break;
            }
        }
        if (hasUndeletedChapter) {
            throw new RuntimeException("该课程下有章节，不能删除");
        }
        return courseMapper.deleteCourseById(id);
    }
    /**
     * 批量启用课程
     *
     * @param ids 需要启用的课程主键集合
     * @return 结果
     */
    @Override
    public int enableCourseByIds(Integer[] ids) {
        return courseMapper.enableCourseByIds(ids);
    }

    /**
     * 多表关联查询：课程+科目信息
     */
    @Override
    public List<Course> selectCourseListWithSubject(Course course) {
        return courseMapper.selectCourseListWithSubject(course);
    }
    //根据科目id查询所有课程名称以及id
    @Override
    public List<Course> selectCourseNameAndIdBySubjectId(Integer subjectId) {
        return courseMapper.selectCourseNameAndIdBySubjectId(subjectId);
    }

    @Override
    public List<Course> selectCourseIdAndName() {
        return courseMapper.selectCourseIdAndName();
    }

    //根据科目id动态查询所有课程名称以及id
    @Override
    public List<Course> selectCourseListBySubjectId(Integer subjectId) {
        return courseMapper.selectCourseListBySubjectId(subjectId);
    }
}
